package com.maikec.utils.mybatis.provider;
/**
 * 邢帅教育
 * <p>
 * 本源代码由数据中心及其作者共同所有，未经版权持有者的事先书面授权，
 * 不得使用、复制、修改、合并、发布、分发和/或销售本源代码的副本。
 *
 * @copyright Copyright (c) 2018. [图片]xsteach.com all rights reserved.
 */

import com.maikec.utils.mybatis.annotation.Table;
import com.maikec.utils.mybatis.exception.NoIdException;
import com.maikec.utils.mybatis.exception.TableException;
import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Objects;

/**
 * crud 通用处理接口
 * @author maikec
 * @date 2018/7/13
 */
public interface Provider<T> {
    /**
     * 验证pojo是否有@Table("tableName")注解
     * @param t
     * @return
     * @throws TableException
     */
    default String getTableName(T t) throws TableException {
        if (!t.getClass().isAnnotationPresent(Table.class)) {
            throw  new TableException();
        }

        return t.getClass().getDeclaredAnnotation(Table.class).value();
    }

    /**
     * 组装id查询条件
     * @param t
     * @return
     * @throws Exception
     */
    default String getIdCondition(T t) throws Exception{
        for (Field field : t.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            if("id".equals(field.getName())) {
                if(field.get(t).equals(0)) {
                    throw new NullPointerException("should set id value");
                }
                return " id = "+field.get(t);
            }
        }
        throw new NoIdException();
    }

    /**
     * 组装sql语句(包括update的set以及select的where)
     * @param t t
     * @param isUpdate 是否组装update的set语句块
     * @return string
     * @throws Exception exception
     */
    default String getSql(T t,boolean isUpdate) throws Exception{
        StringBuilder columns = new StringBuilder();
        for (Field field : t.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            Object object = field.get(t);
            if("id".equals(field.getName()) && Objects.equals(object, 0)) {
                continue;
            }
            if(!StringUtils.isEmpty(object)) {
                columns.append(field.getName());
                columns.append("='");
                if ("java.util.Date".equals(field.getType().getName())) {
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    object = simpleDateFormat.format(object);
                }
                columns.append(object);
                if (isUpdate) {
                    columns.append("',");
                } else {
                    columns.append("' AND ");
                }
            }
        }
        if (isUpdate) {
            return columns.substring(0,columns.length()-1);
        } else {
           return columns.substring(0,columns.length()-5);
        }

    }
}
